#include <iostream>
using namespace std;
const int maxN = 1050;
int fa[maxN];
int height[maxN];   //记录树的高度
int n, m;   //人数 关系数
//初始化
void init(){
    for(int i = 0; i < n; i++){
        fa[i] = i;
        height[i] = 0;	//树的高度
    }
}
//查找

//递归形式
// int find(int i){
//     return fa[i] = fa[i] == i ? i : find(fa[i]);
// }

//迭代形式
int find(int x){
    // //找根节点
    int root = x;
    while(fa[root] != root) root = fa[root];

    int i = x, j;
    while(i != root){
        //父节点
        j = fa[i];
        fa[i] = root;
        i = j;
    }
    return root;
}
//合并
bool merge(int i, int j){
    int fi = find(i), fj = find(j);
    if(fi != fj){       //不在一个集合
        if(height[fi] == height[fj]){
            fa[fi] = fj;
            height[j]++;
        }else { //把矮树并到高树上，高树的高度保持不变
            if(height[fi] < height[fj]){  
                fa[fi] = fj;
            }else{
                fa[fj] = fi;
            }
        }
    }
    return false;
}

//集的数目
int getSize(){
    int ans = 0;
    for(int i = 0; i < n; i++){
        if(fa[i] == i) ans++;
    }
    return ans;
}

int main(){
    cin>>n>>m;
    init();
    int a, b;
    for(int i = 0; i < m; i++){
        cin>>a>>b;
        merge(a, b);
    }
    //集的个数
    cout<<getSize()<<endl;
    return 0;
}